package org.example.context;

import io.netty.channel.ChannelHandlerContext;

import java.util.function.Consumer;

public interface IContext {
    //上下文生命周期：运行中
    int Running = 1;
    //运行过程中发生错误，对其进行标记，告诉我们请求已经结束，需要返回客户端
    int Written = 0;
    // 标记写回成功，防止并发情况下的多次写回
    int Completted = 1;
    //表示网关请求结束
    int Terminated = 2;

    /**
     * 设置上下文状态为运行中
     */
    void runned();

    /**
     * 设置上下文状态为标记写回
     */
    void writtened();

    /**
     * 设置上下文状态为写回成功
     */
    void completed();

    /**
     * 设置上下文状态为请求结束
     */
    void terminated();
    boolean isRunning();
    boolean isWrittened();
    boolean isCompleted();
    boolean isTerminted();

    /**
     * 获取协议
     * @return
     */
    String getProtocol();

    /**
     * 获取请求对象
     * @return
     */
    Object getRequest();
    void setRequest(Object request);

    /**
     * 获取请求对象
     * @return
     */
    Object getResponse();
    void setResponse(Object object);

    void setThrowable(Throwable throwable);
    Throwable getThroable();

    ChannelHandlerContext getNettyCtx(); // 获取netty上下文

    boolean isKeepAlive(); // 判断是否是长连接
    boolean releaseRequest(); // 释放请求资源

    void setCompletedCallBack(Consumer<IContext> consumer); //设置写回接受回调函数
    void invokeCompletedCallBack(Consumer<IContext> consumer); //设置写回接受回调函数

}
